package com.ruoyi.docdraw.service.impl;

import java.util.List;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.docdraw.domain.SysDocDraw;
import com.ruoyi.docdraw.domain.vo.SyncReqVo;
import com.ruoyi.docdraw.mapper.SysDocDrawMapper;
import com.ruoyi.docdraw.mapper.SysDocMapper;
import com.ruoyi.docdraw.service.ISysDocService;
import com.ruoyi.docdraw.vo.SysDocRespVo;
import com.ruoyi.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Map;

import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.docdraw.domain.SysDoc;
import com.ruoyi.docdraw.mapper.SysDocMasterMapper;
import com.ruoyi.docdraw.domain.SysDocMaster;
import com.ruoyi.docdraw.service.ISysDocMasterService;
import org.springframework.util.ObjectUtils;

/**
 * 文档masterService业务层处理
 * 
 * @author lvtian
 * @date 2025-02-26
 */
@Service
public class SysDocMasterServiceImpl implements ISysDocMasterService 
{
    @Autowired
    private SysDocMasterMapper sysDocMasterMapper;

    @Autowired
    private ISysDeptService deptService;

    @Autowired
    private ISysDocService docService;

    @Autowired
    SysDocMapper sysDocMapper;


    @Autowired
    SysDocDrawMapper sysDocDrawMapper;
    /**
     * 查询文档master
     * 
     * @param docMasterId 文档master主键
     * @return 文档master
     */
    @Override
    public SysDocMaster selectSysDocMasterByDocMasterId(Long docMasterId)
    {
        return sysDocMasterMapper.selectSysDocMasterByDocMasterId(docMasterId);
    }

    /**
     * 查询文档master列表
     * 
     * @param sysDocMaster 文档master
     * @return 文档master
     */
    @Override
    public List<SysDocMaster> selectSysDocMasterList(SysDocMaster sysDocMaster)
    {
        return sysDocMasterMapper.selectSysDocMasterList(sysDocMaster);
    }
    /**
     * 文档Master 数据页面处理
     * @param sysDocMasterList
     * @return
     */
    @Override
    public List<SysDocRespVo> docMasterListProcessor(List<SysDocMaster> sysDocMasterList) {
        List<SysDocRespVo> vos = new ArrayList<>();
        for (SysDocMaster sysDocMaster : sysDocMasterList) {
            SysDocRespVo vo = new SysDocRespVo();
            BeanUtils.copyBeanProp(vo ,sysDocMaster);
            vo.setDocNumber(sysDocMaster.getDocNumber());
            Long deptId = sysDocMaster.getDeptId();
            SysDept sysDept = deptService.selectDeptById(deptId);
            vo.setDeptName(sysDept.getDeptName());
            List<SysDoc> sysDocList = sysDocMaster.getSysDocList();
            sysDocList = docService.sortByVersion(sysDocList);
            SysDoc sysDoc = sysDocList.get(0);
            if(!ObjectUtils.isEmpty(sysDoc)){
                BeanUtils.copyBeanProp(vo ,sysDoc);
            }
            vos.add(vo);
        }
        return vos;
    }



    /**
     * 新增文档master
     * 
     * @param sysDocMaster 文档master
     * @return 结果
     */
    @Transactional
    @Override
    public int insertSysDocMaster(SysDocMaster sysDocMaster)
    {
//        sysDocMaster.setCreateTime(DateUtils.getNowDate());
        int rows = sysDocMasterMapper.insertSysDocMaster(sysDocMaster);
        insertSysDoc(sysDocMaster);
        return rows;
    }

    /**
     * 修改文档master
     *
     * @param sysDocMaster 文档master
     * @return 结果
     */
    @Transactional
    @Override
    public int updateSysDocMaster(SysDocMaster sysDocMaster)
    {

        // 先删除 sys_doc_draw 表中与 sys_doc 关联的记录
        sysDocDrawMapper.deleteSysDocDrawByDocMasterId(sysDocMaster.getDocMasterId());

        // 再删除 sys_doc 表中的记录
//        sysDocMapper.deleteSysDocByDocMasterId(sysDocMaster.getDocMasterId());

        // 插入新的 sys_doc 记录
        insertSysDoc(sysDocMaster);

        // 更新 sys_doc_master 表
        return sysDocMasterMapper.updateSysDocMaster(sysDocMaster);
    }

    /**
     * 批量删除文档master
     * 
     * @param docMasterIds 需要删除的文档master主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteSysDocMasterByDocMasterIds(Long[] docMasterIds)
    {
        sysDocMasterMapper.deleteSysDocByDocMasterIds(docMasterIds);
        return sysDocMasterMapper.deleteSysDocMasterByDocMasterIds(docMasterIds);
    }

    /**
     * 删除文档master信息
     * 
     * @param docMasterId 文档master主键
     * @return 结果
     */
    @Transactional
    @Override
    public int deleteSysDocMasterByDocMasterId(Long docMasterId)
    {
        sysDocMasterMapper.deleteSysDocByDocMasterId(docMasterId);
        return sysDocMasterMapper.deleteSysDocMasterByDocMasterId(docMasterId);
    }


    /**
     * 文档信息同步方法
     * @param deptId
     * @param userId
     * @return
     */
    @Override
    public int syncDocDraw(Long deptId, Long userId) {

        SysDocMaster sysDocMaster = new SysDocMaster();
        // 系统管理员执行和租户管理员执行
        if(ObjectUtils.isEmpty(deptId)){
            // 系统管理员运行
        }else {
            // 租户管理员运行
            sysDocMaster.setDeptId(deptId);
        }
        List<SysDocMaster> sysDocMasters = selectSysDocMasterList(sysDocMaster);

        // 获取待发送信息集合
        List<SyncReqVo> syncReqVos = getSyncReqVoBySysDocMasters(sysDocMasters);

        // 循环发送到不同的
        return 0;
    }









    /**
     * 获取待发送请求集合
     * @param sysDocMasters
     * @return
     */
    public List<SyncReqVo> getSyncReqVoBySysDocMasters(List<SysDocMaster> sysDocMasters){
        List<SyncReqVo> vos = new ArrayList<>();
        // key是组织 value是组织下docMaster对象
        Map<Long, List<SysDocMaster>> deptIds = SysDocMaster.getFieldValuesAsMap(sysDocMasters, "deptId", Long.class);

        return vos;
    }




//    /**
//     * 新增文档信息
//     *
//     * @param sysDocMaster 文档master对象
//     */
//    public void insertSysDoc(SysDocMaster sysDocMaster)
//    {
//        List<SysDoc> sysDocList = sysDocMaster.getSysDocList();
//        Long docMasterId = sysDocMaster.getDocMasterId();
//        if (StringUtils.isNotNull(sysDocList))
//        {
//            List<SysDoc> list = new ArrayList<SysDoc>();
//            for (SysDoc sysDoc : sysDocList)
//            {
//                sysDoc.setDocMasterId(docMasterId);
//                list.add(sysDoc);
//            }
//            if (list.size() > 0)
//            {
//                sysDocMasterMapper.batchSysDoc(list);
//
//            }
//        }
//    }


//    @Transactional
//    public void insertSysDoc(SysDocMaster sysDocMaster) {
//        List<SysDoc> sysDocList = sysDocMaster.getSysDocList();
//        Long docMasterId = sysDocMaster.getDocMasterId();
//        if (StringUtils.isNotNull(sysDocList)) {
//            List<SysDoc> list = new ArrayList<>();
//            for (SysDoc sysDoc : sysDocList) {
//                sysDoc.setDocMasterId(docMasterId);
//                list.add(sysDoc);
//            }
//            if (list.size() > 0) {
//                // 插入 sys_doc 表数据
//                sysDocMasterMapper.batchSysDoc(list);
//                // 插入 sys_doc_draw 表数据
//                sysDocMasterMapper.batchSysDocDraw(list);
//            }
//        }
//    }



    @Transactional
    public void insertSysDoc(SysDocMaster sysDocMaster) {
        List<SysDoc> sysDocList = sysDocMaster.getSysDocList();
        Long docMasterId = sysDocMaster.getDocMasterId();
        if (StringUtils.isNotNull(sysDocList)) {
            List<SysDoc> list = new ArrayList<>();
            for (SysDoc sysDoc : sysDocList) {
                sysDoc.setDocMasterId(docMasterId);
                list.add(sysDoc);
            }
            if (list.size() > 0) {
                // 插入 sys_doc 表数据，并获取生成的 doc_id
                sysDocMasterMapper.batchSysDoc(list);

                // 将生成的 doc_id 赋值给 sys_doc_draw 表中的 doc_id 字段
                for (SysDoc sysDoc : list) {
                    List<SysDocDraw> sysDocDrawList = sysDoc.getSysDocDrawList();
                    if (sysDocDrawList != null) {
                        for (SysDocDraw draw : sysDocDrawList) {
                            draw.setDocId(sysDoc.getDocId());
                        }
                    }
                }

                // 插入 sys_doc_draw 表数据
                sysDocMasterMapper.batchSysDocDraw(list);
            }
        }
    }

}
